package main

import "fmt"

//管道的使用
func main() {
	//chan是引用类型
	var cha chan int
	cha = make(chan int, 3)

	fmt.Println("cha的本身地址", &cha)
	fmt.Println("cha的存储的内容（地址）", cha)

	//向管道写入数据
	cha <- 10
	num := 111
	cha <- num

	//注意：给管道写入数据时，超过容量出现 “死锁” 错误
	//cha <- 16
	//cha <- 15

	//管道的长度和容量
	fmt.Printf("cha的长度=%v,cha的容量=%v\n", len(cha), cap(cha))

	//从管道中读取数据
	n2 := <-cha
	fmt.Println("第一个推出的数据", n2)

	//如果在没有使用协程的情况下，如果管道的数据已经全部取出，再次取会报 “死锁” 错误
	//n2 = <- cha
	//n2 = <- cha
	//n2 = <- cha

	//通道中存储全部数据类型
	test()
}

type Person struct {
	Name string
}

func test() {
	//chan存储任意数据类型
	var c chan interface{} = make(chan interface{}, 10)
	c <- Person{
		Name: "tom",
	}
	c <- map[string]string{
		"name": "name",
		"age":  "age",
	}
	c <- 1.2
	c <- 12
	c <- make([]int, 10)
	c <- "name"

	//需要类型强转
	p := (<-c).(Person)

	fmt.Println("p.name = ", p.Name)
}
